iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0

哈囉!大家好~
目前 To-do List 的資料庫功能已經完成的差不多了,在本地端測試也都非常正常。但是如果今天不是在我的電腦上跑,而是換了一個不一樣的環境,那 To-do List 專案就會需要做修改,所以今天會介紹在後端開發時,都會有的一個 .env 檔案!

今日分享大綱:

  1. .env 是什麼? 為什麼需要?
  2. .env 檔案通常都放什麼?

1. .env 是什麼?為什麼需要?

在前面剛剛有提到,環境的轉換有可能會導致專案內容的部分修改,但是我們不可能因為環境的轉換就重新修改程式,然後重新打包、部署,這些修改的動作很有可能會讓程式編譯錯誤!

所以,為了降低錯誤的發生以及提高專案的安全、可移植性,就出現了 .env 這個檔案。

.env 檔案是什麼? → 是一個「 環境設定檔 」。

專門放專案執行時,會用到的 環境變數(Environment Variables)

📌 環境變數的特性:

  • 不會寫死在程式碼裡(安全、可移植)。
  • 可依照環境(開發/測試/上線)切換。
  • 可透過 os.Getenv("KEY") 讀取。

那什麼時候會需要用到環境變數?
像是 To-do List 專案中,就有資料庫的設定,這部分的設定資訊,就可以把它放進 .env 檔案中,方便之後更換資料庫時快速切換使用。

而在一般專案中,常見的可能有:API Key(第三方服務)、JWT Secret 等,所以如果把這些資訊都寫死在程式裡,是不是想到要更改就覺得很麻煩 🫠 

另一方面是會有安全性的問題,因為密碼都直接寫在程式裡面了!
也就是這樣,才會需要用 環境變數 來統一管理這些資訊。


2. .env 檔案通常都放什麼?

那通常會在 .env 檔案裡面放什麼? 前面已經有大概提到了一些,這邊會列出常見的分類與範例給大家參考!
內容大概分成三項目:

  1. 資料庫設定
  2. 伺服器設定
  3. API 金鑰 / 密碼設定

1. 資料庫設定

現在的 To-do List 專案使用的資料庫是 Sqlite,如果之後要改成其他的資料庫的話,就需要把相關的設定寫進 .env 檔案裡,然後將還沒有要使用的部分註解,方便之後更換~

主要會設定:

  • DB_NAME:使用哪一個資料庫(例如:sqlite、postgres、mysql 等)。
  • DB_URL:資料庫連線字串。

範例:

DB_NAME= sqlite
DB_URL= tasks.db

# 如果之後改用 PostgreSQL,可以改成:
# DB_DRIVER= postgres
# DB_URL= postgres://user:password@localhost:8080/todolist

2. 伺服器設定

在 Gin 的框架中,有一個東西叫做 GIN_MODE,它是 Gin 框架設定執行模式(Environment Mode)的環境變數,用來控制伺服器在不同環境下的行為。

→ 意思是 GIN_MODE 會依照設定,改變我們啟動 server (go run main.go)之後的模式。

GIN_MODE 總共有 3 種模式:

  • debug:預設模式。會印出詳細的 log、錯誤、請求紀錄。(方便開發使用)
  • release :生產模式。關閉 debug 訊息、錯誤,不印多餘 log,效能較佳。(正式環境)
  • test :測試模式。類似 debug,但會關閉彩色輸出,常用於單元測試。(測試)

這 3 種模式能夠讓我們在開發與正式環境中,透過不同的設定有不同的功能!像是開發時,要能方便除錯;但專案上線之後,需要的是能提升效能、並且隱藏錯誤訊息。

範例:

# 本地開發環境
GIN_MODE= debug

# 部署到正式環境
GIN_MODE= release

另一個則是 Port 的設定,指的是伺服器運行時的 port(例如:8080)。這個也是可以把它寫在 .env 檔案裡,方便管理、設定專案啟動之後所需對應的 port。

範例:

PORT= 8080

3. API 金鑰 / 密碼設定

API 金鑰和密碼設定都是屬於「 敏感資訊 」,通常不應該直接寫在程式碼裡,因為會有洩漏的風險的存在。

  • API 金鑰(API Key):呼叫第三方服務的鑰匙(密碼)。

    舉例來說,如果專案有使用到 OpenAI API、Google Maps API 等這些第三方的服務,那他們一定會給你一組專屬的金鑰,而在你每次連線使用這些服務時,會先確認你的 API Key 是否符合,才能使用。

    範例:

    OPENAI_API_KEY= sk-1234abcd5678efgh
    

    通常每一組 API Key 都是獨一無二的,而且都具有權限,因為可能會涉及扣款等功能。所以如果 API Key 不小心洩漏給別人知道,別人就可以存取你的 API 或是資料庫,就會有資安的風險。

  • 密碼設定:從字面上的意思來看就是「 密碼 」。

    常見的密碼設定包括資料庫密碼、JWT 金鑰、信箱密碼、憑證等之類的。這一類型的就更不能讓其他人知道了!

    • 資料庫密碼:連線資料庫時使用。
    • JWT 金鑰:產生登入 token 時使用。
    • OAuth 憑證:用 Google 登入時的密鑰。

    範例:

    DB_PASSWORD= mysecret
    JWT_SECRET= myjwtkey123
    GOOGLE_CLIENT_SECRET= xyz
    

除了上述的資訊之外,可以依照自己的專案需求新增或減少~
但最重要的是 .env 檔案 不應該上傳到 GitHub 或是 Gitlab 上,避免造成資安的風險。所以要在 .gitignore 檔案裡面增加這行:


上一篇
Day24 - ORM 關聯:新增分類 CRUD 功能
系列文
Go,一起成為全端吧!—— 給前端工程師的 Golang 後端學習筆記25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言